From: Tim Lunn Date: Sun, 21 Apr 2013 23:49:14 +0000 (+1000) Subject: AppMenuButton: Improve handling of signals X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4314 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ee4f199a9ff9f302d01393c9b6b79a0a1680db8f;p=gnome-shell.git AppMenuButton: Improve handling of signals If for some reason an extension needs to destroy the AppMenu object, currently it is not possible to do this cleanly due to these signals remaining connected. https://bugzilla.gnome.org/show_bug.cgi?id=698531 --- diff --git a/js/ui/panel.js b/js/ui/panel.js index 5d2952cf7..332be12b1 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -289,10 +289,10 @@ const AppMenuButton = new Lang.Class({ this._visible = !Main.overview.visible; if (!this._visible) this.actor.hide(); - Main.overview.connect('hiding', Lang.bind(this, function () { + this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () { this.show(); })); - Main.overview.connect('showing', Lang.bind(this, function () { + this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () { this.hide(); })); @@ -302,10 +302,12 @@ const AppMenuButton = new Lang.Class({ let tracker = Shell.WindowTracker.get_default(); let appSys = Shell.AppSystem.get_default(); - tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged)); - appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged)); - - global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync)); + this._focusAppNotifyId = + tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged)); + this._appStateChangedSignalId = + appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged)); + this._switchWorkspaceNotifyId = + global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync)); this._sync(); }, @@ -643,6 +645,33 @@ const AppMenuButton = new Lang.Class({ this.setMenu(menu); this._menuManager.addMenu(menu); + }, + + destroy: function() { + if (this._appStateChangedSignalId > 0) { + let appSys = Shell.AppSystem.get_default(); + appSys.disconnect(this._appStateChangedSignalId); + this._appStateChangedSignalId = 0; + } + if (this._focusAppNotifyId > 0) { + let tracker = Shell.WindowTracker.get_default(); + tracker.disconnect(this._focusAppNotifyId); + this._focusAppNotifyId = 0; + } + if (this._overviewHidingId > 0) { + Main.overview.disconnect(this._overviewHidingId); + this._overviewHidingId = 0; + } + if (this._overviewShowingId > 0) { + Main.overview.disconnect(this._overviewShowingId); + this._overviewShowingId = 0; + } + if (this._switchWorkspaceNotifyId > 0) { + global.window_manager.disconnect(this._switchWorkspaceNotifyId); + this._switchWorkspaceNotifyId = 0; + } + + this.parent(); } });